package com.uex.dev.manage.common.utils;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import lombok.extern.slf4j.Slf4j;

import java.lang.reflect.Type;

/**
 * @author wangc
 * @create 2023/9/25
 * @description
 */
@Slf4j
public class GsonUtil {
    private static final Gson GSON = new Gson();

    public static String toJson(Object object) {
        return GSON.toJson(object);
    }

    /**
     * 复合泛型 推荐使用
     * <p>
     * GsonUtil.fromJson(resp, new TypeToken<RespObj<BillCheck>>() {}.getType());
     * 如果使用 GsonUtil.fromJson(resp, RespObj<BillCheck>.class); 会导致BillCheck泛型擦除
     * </p>
     *
     * @param json json字符串
     * @param type type
     * @param <T>  复合泛型
     * @return
     */
    public static <T> T fromJson(String json, Type type) {
        return GSON.fromJson(json, type);
    }

    /**
     * 复合泛型 推荐使用
     * <p>
     * GsonUtil.fromJson(resp, new TypeToken<RespObj<BillCheck>>() {});
     * 如果使用 GsonUtil.fromJson(resp, RespObj<BillCheck>.class); 会导致BillCheck泛型擦除
     * </p>
     *
     * @param json    json字符串
     * @param typeOfT TypeToken
     * @param <T>     复合泛型
     * @return
     */
    public static <T> T fromJson(String json, TypeToken<T> typeOfT) {
        return GSON.fromJson(json, typeOfT);
    }

    /**
     * 单泛型 推荐使用
     * <p>
     * GsonUtil.fromJson(resp, BillCheck.class);
     * </p>
     *
     * @param json  json字符串
     * @param clazz class
     * @param <T>   单泛型
     * @return
     */
    public static <T> T fromJson(String json, Class<T> clazz) {
        return GSON.fromJson(json, clazz);
    }
}
